home *** CD-ROM | disk | FTP | other *** search
/ CD ROM Paradise Collection 4 / CD ROM Paradise Collection 4 1995 Nov.iso / program / swagd_f.zip / DATETIME.SWG / 0020_UNIXTIME.PAS.pas < prev    next >
Pascal/Delphi Source File  |  1993-05-28  |  4KB  |  204 lines

  1. {
  2. INBAR RAZ
  3.  
  4. I just happen to have Programmed such a thing, For a certain Program. It's not
  5. perfect, in the essence that It will produce good results only from 1970 to
  6. 2099, because I didn't feel like starting to investigate which are leap years
  7. and which are not. All the leap years between 1970 and 2099 ARE included,
  8. though.
  9.  
  10. This Procedure returns a LongInt UNIX-like timestamp. TimeRec will be
  11. overwritten by the resulted UNSIGNED DWord.
  12. }
  13.  
  14. Procedure SecondSince1970(Year, Month, Day, Hour, Minute : Word; Var TimeRec);
  15.  
  16. Var
  17.   T_Lo,
  18.   T_Hi  : Word;
  19.  
  20. begin
  21.   Asm
  22.  
  23.     Call @Table
  24.  
  25.    @Table:
  26.  
  27.     Pop Si
  28.     Add Si,6            { Point Si to data table }
  29.     Jmp @Compute
  30.  
  31.     { This table contains the number of days in all months Until this one }
  32.  
  33.     dw  0               { Within January }
  34.     dw  31              { January }
  35.     dw  59              { February }
  36.     dw  90              { Mars }
  37.     dw  120             { April }
  38.     dw  151             { May }
  39.     dw  181             { June }
  40.     dw  212             { July }
  41.     dw  243             { August }
  42.     dw  273             { September }
  43.     dw  304             { October }
  44.     dw  334             { November }
  45.  
  46.     { This i a routine to multiply a DWord by a Word }
  47.     { Input: DX:AX Word to multilpy, CX multiplier }
  48.  
  49.    @Calc:
  50.  
  51.     Push Si
  52.     Push Di
  53.  
  54.     Mov Di,Dx
  55.     Mov Si,Ax
  56.  
  57.     Dec Cx              { We already have it multiplied by 1 }
  58.  
  59.    @Addit:
  60.  
  61.     Add Ax,Si
  62.     Adc Dx,Di
  63.  
  64.     Loop @Addit
  65.  
  66.     Pop Di
  67.     Pop Si
  68.  
  69.     Ret
  70.  
  71.    @Compute:
  72.  
  73.     Xor Di,Di           { Variable For leap year }
  74.  
  75.     { Seconds of round years }
  76.  
  77.     Mov Bx,Year
  78.     Sub Bx,1970
  79.     Mov Ax,365*24       { Hours per year }
  80.     Mov Cx,60*60        { Seconds per hour }
  81.     Xor Dx,Dx
  82.  
  83.     Call @Calc          { Multiply dWord response by CX }
  84.     Mov Cx,Bx
  85.     Call @Calc
  86.  
  87.     Push Ax
  88.     Push Dx
  89.  
  90.     { Seconds of leap years }
  91.  
  92.     Mov Ax,Year
  93.     Sub Ax,1972         { First leap year after 1972 }
  94.     Mov Bx,4
  95.     Xor Dx,Dx
  96.     Div Bx
  97.  
  98.     { DX now holds number of days to add becaues of leap years. }
  99.     { if DX is 0, this is a leap year, and we need to take it into
  100.       conideration }
  101.  
  102.     Mov Di,Dx          { if DI is 0, this is a leap year }
  103.  
  104.     Inc Ax             { We must count 1972 as well }
  105.     Xor Dx,Dx
  106.     Mov Bx,60*60
  107.     Mov Cx,24
  108.  
  109.     Mul Bx
  110.     Call @Calc
  111.  
  112.     Mov Cx,Dx
  113.     Mov Bx,Ax
  114.  
  115.     { Now add what we had before }
  116.  
  117.     Pop Dx
  118.     Pop Ax
  119.  
  120.     Add Ax,Bx
  121.     Adc Dx,Cx
  122.  
  123.     Push Ax
  124.     Push Dx
  125.  
  126.     { DX:AX holds the number of seconds since 1970 till the beginning of year}
  127.  
  128.     { Add days Within this year }
  129.  
  130.     Mov Bx,Month
  131.     Dec Bx
  132.     Shl Bx,1
  133.     Add Bx,Si
  134.     Mov Bx,cs:[Bx]      { Lookup Table, sum of months EXCEPT this one }
  135.     Add Bx,Day          { Add days Within this one }
  136.     Dec Bx              { Today hasn't ended yet }
  137.  
  138.     Mov Ax,60*60
  139.     Mov Cx,24
  140.     Xor Dx,Dx
  141.     Mul Bx
  142.     Call @Calc
  143.  
  144.     Mov Cx,Dx
  145.     Mov Bx,Ax
  146.  
  147.     { Now add what we had before - days Until beginning of the year }
  148.  
  149.     Pop Dx
  150.     Pop Ax
  151.  
  152.     Add Ax,Bx
  153.     Adc Dx,Cx
  154.  
  155.     { DX:AX now holds the number of seconds since 1970 till beginning of day.}
  156.  
  157.     Push Ax
  158.     Push Dx
  159.  
  160.     { DX:AX holds the number of seconds Until the beginning of this day }
  161.  
  162.     Mov Bx,Hour
  163.     Mov Ax,60*60   { Seconds per hour }
  164.     Xor Dx,Dx
  165.     Mul Bx
  166.  
  167.     Push Ax
  168.     Push Dx
  169.  
  170.     Mov Bx,Minute
  171.     Mov Ax,60      { Seconds per minute }
  172.     Xor Dx,Dx
  173.     Mul Bx
  174.  
  175.     Mov Cx,Dx
  176.     Mov Bx,Ax
  177.  
  178.     Pop Dx
  179.     Pop Ax
  180.  
  181.     Add Bx,Ax
  182.     Adc Cx,Dx
  183.  
  184.     { And add the seconds Until beginning of year }
  185.  
  186.     Pop Dx
  187.     Pop Ax
  188.  
  189.     Add Ax,Bx
  190.     Adc Dx,Cx
  191.  
  192.     { DX:AX now holds number of second since 1970 }
  193.  
  194.     Mov T_Hi,Dx
  195.     Mov T_Lo,Ax
  196.  
  197.   end;
  198.  
  199.   Move(Mem[Seg(T_Lo) : Ofs(T_Lo)], Mem[Seg(TimeRec) : Ofs(TimeRec)], 2);
  200.  
  201.   Move(Mem[Seg(T_Hi) : Ofs(T_Hi)], Mem[Seg(TimeRec) : Ofs(TimeRec) + 2], 2);
  202.  
  203. end;
  204.